package org.nutz.dao.impl.link;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.nutz.dao.entity.Entity;
import org.nutz.dao.entity.LinkField;
import org.nutz.dao.impl.AbstractLinkVisitor;
import org.nutz.dao.impl.EntityHolder;
import org.nutz.dao.impl.entity.field.ManyManyLinkField;
import org.nutz.dao.sql.Pojo;
import org.nutz.dao.util.RelationObjectMap;
import org.nutz.lang.Each;
import org.nutz.lang.ExitLoop;
import org.nutz.lang.Lang;
import org.nutz.lang.LoopException;

public class DoInsertRelationLinkVisitor extends AbstractLinkVisitor {

	private EntityHolder holder;

	public DoInsertRelationLinkVisitor(EntityHolder holder) {
		this.holder = holder;
	}

	public void visit(final Object obj, LinkField lnk) {
		// 只有多对多的映射才被考虑
		if (lnk instanceof ManyManyLinkField) {
			// 获取两边映射主键的值
			final ManyManyLinkField mm = (ManyManyLinkField) lnk;

			Object value = lnk.getValue(obj);
			
			final List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(Lang.length(value));
			Lang.each(value, new Each<Object>() {
				public void invoke(int i, Object ele, int length) throws ExitLoop, LoopException {
					list.add(new RelationObjectMap(mm, obj, ele));
				}
			});

			if (list.isEmpty())
				return;

			Entity<Map<String, Object>> en = holder.makeEntity(mm.getRelationName(), list.get(0));
			Pojo pojo = opt.maker().makeInsert(en);
			pojo.setOperatingObject(list);
			for (Object p : list)
				pojo.addParamsBy(p);

			opt.add(pojo);

		}
	}

}
